/****************************************
** 说明：    员工管理系统客户端
****************************************/

#include "client_module.h"
#include "display_login.h"

/*   命令对应关系    */
// 管理员
// A -- 添加普通用户
// B -- 查询所有用户
// C -- 修改用户密码
// D -- 删除指定用户
// E -- 显示当前服务器文件
// F -- 向服务器上传文件
// G -- 从服务器下载文件
// H -- 管理员退出登陆，返回一级菜单

// 普通用户
// 1 -- 查看本地用户信息
// 2 -- 修改本地用户密码
// 3 -- 查询其他人特定信息
// 4 -- 显示当前服务器文件
// 5 -- 从服务器下载文件
// 6 -- 普通用户退出登陆返回一级菜单


/* 变量集合 */
struct variable_struct {
    int client_fd;                       // 客户端套接字描述符
    struct sockaddr_in server_addr;      // 服务器套接字信息配置结构体
    char  ioctl_cmd;                      // 操作命令
    
}variable;

//登陆信息存储结构体
struct login_inform {
	char login_user[32];
	char login_passwd[32];
}logininfo;


int main(int argc, const char *argv[]) {
    /* IP地址通过命令行传参，并判错 */
    if (argc != 3) {
        fprintf(stderr, "Usage: ./client ipaddr");
        exit(EXIT_FAILURE);
    }

    /* 创建套接字，并返回文件描述符 */
    variable.client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (variable.client_fd == -1) {
        perror("fail to socket");
        exit(EXIT_FAILURE);
    }

    /* 配置服务器端的地址和端口信息 */
    variable.server_addr.sin_family = AF_INET;
    variable.server_addr.sin_port = htons(atoi(argv[2]));
    variable.server_addr.sin_addr.s_addr = inet_addr(argv[1]);
    bzero(variable.server_addr.sin_zero, 8);

    /* 向服务器端发送连接请求 */
    if (connect(variable.client_fd, (struct sockaddr *)&variable.server_addr, sizeof(struct sockaddr)) == -1) {
        perror("fail to connect");
        exit(EXIT_FAILURE);
    }

    /* 程序大循环 */
    while (1) {
login:
        // 一级菜单
        // 登录操作
		dispaly_login_in();
		scanf("%c", &variable.ioctl_cmd); //接受选择命令
		getchar();
        if (variable.ioctl_cmd == '1')
		{
                // 发送服务器用户和密码
                // 接收服务器的验证标志
                // 判断并打印登录请求
				int ret;
				login_input_operations(logininfo.login_user, logininfo.login_passwd);
				send(variable.client_fd, &logininfo, sizeof(logininfo), 0);
				recv(variable.client_fd, &ret, 4, 0);

                if (ret == 1) {
                    /* 管理员登陆 */
                    while (1) {
                        // 显示二级菜单， 管理员
                        // 选项操作
						display_root();
						printf(">>>>>>");
						scanf("%c", &variable.ioctl_cmd); //接受选择命令
						getchar();
						send(variable.client_fd, &variable.ioctl_cmd, 1, 0); //向服务器发送命令
                        /* 管理员控制 */
                        switch (variable.ioctl_cmd) {
                            case 'A' :
                                // 添加普通用户
								add_user(variable.client_fd);
                                break;
                            
                            case 'B' :
                                // 查询指定
								query_user(variable.client_fd);
                                break;
                            
                            case 'C' :
                                // 修改用户密码
								update_user(variable.client_fd);
                                break;
                            
                            case 'D' :
                                // 删除指定用户
								del_user(variable.client_fd);
                                break;
                            
                            case 'H' :
								// 返回一级菜单
                                goto login;
                                break;
							case 'E' :
								// 显示服务器文件
								list_file(variable.client_fd);
								break;
							case 'F':
								// 向服务器上传文件
								put_file(variable.client_fd);
								break;
							case 'G' :
								// 从服务器下载文件
								load_file(variable.client_fd);
								break;
							default :
								// 输入错误命令
                                printf("input invalid number\n");
								break;
                        }
                    }
                }else if (ret == 2) {
                    /* 普通用户登陆 */
                    while (1) {
                        // 显示二级菜单， 普通用户
                        // 选项操作
                        display_user();
						scanf("%c", &variable.ioctl_cmd); //接受选择命令
						getchar();
						send(variable.client_fd, &variable.ioctl_cmd, 1, 0); //向服务器发送命令
                        switch (variable.ioctl_cmd) {
                            case '1' :
                                // 查看本地信息
								user_query(variable.client_fd, logininfo.login_user);
                                break;

                            case '2' :
                                // 修改本地用户密码
								user_update_passwd(variable.client_fd, logininfo.login_user);
                                break;

							case '3':
								// 查询其他人特定信息
								user_query_other_people(variable.client_fd);
								break;	
                            case '6' :
								// 返回一级菜单
                                goto login;
                                break;
                            case '4' :
								// 显示服务器文件
								list_file(variable.client_fd);
								break;
							case '5' :
								// 从服务器下载文件
								load_file(variable.client_fd);
								break;
                            default :
								// 错误命令
                                printf("input invali number\n");
                        }
                    }
                }else{
                	//登陆失败
					printf("fail to login in, try again\n");
					goto login;
				}
		}else if(variable.ioctl_cmd == '2'){            
                // 退出程序
				strcpy(logininfo.login_user, "quit");
				send(variable.client_fd, &logininfo, sizeof(logininfo), 0);								
                break;
		}else{
			//登陆时输入错误命令
             printf("input the invalid number\n");
			 continue;
        }
    }

    /* 关闭连接 */
    close(variable.client_fd);

    return 0;
}
